package com.itbaizhan;

import jdk.jfr.events.FileReadEvent;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/**
 * CheckedException 异常在编译时就必须处理，否则无法通过编译
 * 使用“try/catch” 捕获异常
 * 使用“throws”声明异常
 */
/*try: try语句指定了一段代码，该段代码就是异常捕获并处理的范围。在执行过程中，当任
* 意一条语句产生异常时，就会跳过该条语句后面的代码中后面的代码（例：try语句中的语句2
* 异常，下面的语句3,语句4...,不执行）。代码中可能会产生并抛出一种或几种类型的异常
* 对象，它后面的catch语句要分别对这些异常做相应的处理。
*  一个try语句必须带有至小一个catch语句块或一个finally语句块
 */

//注：当异常处理的代码执行结束以后，不会回到try语句去执行尚未执行的代码
 /*catch:
 *   每个try语句可以伴随一个或多个catch语句，用于处理可能产生的不同类型的异常对象
 *    捕获异常时的顺序：如果异常类之间有继承关系，先捕获子类异常再捕获父类异常*/
 /*finally:
 *      不管是否发生了异常，都必须要执行
 *      通常在finally中关闭已打开的资源，比如文件流、释放数据库连接等*/
public class TestCheckedException {
    public static void main(String[] args) /*throws IOException*/ {
       /* File file = new File("d:a.txt");
        file.createNewFile();*/

      /*  File file = new File("d:a.txt");
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }*/
        FileReader reader =null; //声明
        try {
            FileReader read = new FileReader("d:/a.txt");
            //每调一下读一个字母
            char c = (char) read.read();//原先是int,转化为char
            char c2 = (char) read.read();
            char c3 = (char) read.read();
            System.out.println(""+c+c2+c3);
        } catch (FileNotFoundException e) { //public class FileNotFoundException extends IOException
            e.printStackTrace();
        } catch (IOException e) { //儿子在前面，父亲在后面   FileNotFoundException 是儿子
            e.printStackTrace();
        }finally {  //关闭资源  这里是关闭系统打开的硬盘里的文件
            try {
                if(reader!=null) {
                    reader.close();//因为read是在try中new的，所以要在try语句外面声明
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

}
